#ifndef __BSP_UART_FIFO_H_
#define __BSP_UART_FIFO_H_

#include "bsp.h"

#define	UART1_FIFO_EN	1		// printf
#define	UART2_FIFO_EN	1		// gsm 
#define	UART3_FIFO_EN	0				

#define MENU_TMR_ID		(TMR_COUNT-1)		


/* 定义串口参数 */
#if UART1_FIFO_EN ==1				
	#define UART1_BAUD		115200	
	#define UART1_TX_BUF_SIZE	1*1024
	#define UART1_RX_BUF_SIZE	1*1024	
#endif


#if UART2_FIFO_EN ==1
	#define UART2_BAUD		115200			
	#define UART2_TX_BUF_SIZE	1*1024
	#define UART2_RX_BUF_SIZE	1*1024	
#endif


#if UART3_FIFO_EN ==1					
	#define UART3_BAUD		115200			
	#define UART3_TX_BUF_SIZE	1*1024
	#define UART3_RX_BUF_SIZE	1*1024	
#endif

/* 定义端口号 */
typedef enum
{
	COM1 = 0,	
	COM2 = 1,
	COM3 = 2,
	COM4 = 3,
	COM5 = 4,
	COM6 = 5,

}COM_PORT_E;


/* 串口设备结构体 */
typedef struct
{
	USART_TypeDef *uart;		/* STM32内部串口设备指针 */
	uint8_t *pTxBuf;			/* 发送缓冲区 */
	uint8_t *pRxBuf;			/* 接收缓冲区 */
	uint16_t usTxBufSize;		/* 发送缓冲区大小 */
	uint16_t usRxBufSize;		/* 接收缓冲区大小 */
	__IO uint16_t usTxWrite;	/* 发送缓冲区写指针 */
	__IO uint16_t usTxRead;		/* 发送缓冲区读指针 */
	__IO uint16_t usTxCount;	/* 等待发送的数据个数 */

	__IO uint16_t usRxWrite;	/* 接收缓冲区写指针 */
	__IO uint16_t usRxRead;		/* 接收缓冲区读指针 */
	__IO uint16_t usRxCount;	/* 还未读取的新数据个数 */

	void (*SendBefor)(void); 	/* 开始发送之前的回调函数指针（主要用于RS485切换到发送模式） */
	void (*SendOver)(void); 	/* 发送完毕的回调函数指针（主要用于RS485将发送模式切换为接收模式） */
	void (*ReciveNew)(uint8_t _byte);	/* 串口收到数据的回调函数指针 */
	
}UART_T;




/* USART数据处理 */
typedef bool ( *usart_procDataHdlr_f ) ( uint16_t DataSize, uint8_t *Data );



typedef struct 
{
	/* 是否有效？ */
	uint8_t DevStatus;
#define USART_INIT_PARAMS_BIT     0x01  /* 初始化参数 */
#define USART_START_OK_BIT        0x02  /* 启动成功 */
	
  /* 超时计数器 */
  volatile uint32_t UsartProcCount; 

  /* 超时重载计数器 */
  volatile uint32_t UsartRxTimeoutReload;

	/* 缓冲器类型 */
	volatile uint8_t bufferType;
#define USART_RX_DEFAULT_BUFFER		0x00  /* 一级缓存 */
#define USART_RX_FIFO_BUFFER		0x0F  /* 二级缓存 */

  /* USART接收缓冲 */
  volatile uint16_t RxCounter;
  volatile uint8_t  *RxBuffer;

  /* 接收二级缓冲 */
  volatile uint16_t SwCounter;
  volatile uint8_t  *RxSWFIFO;

  /* USART数据处理句柄 */
  usart_procDataHdlr_f UsartDataHandler;

} USART_DevTypedef;


typedef enum{
	
	DEV_GSM=1,
	
	DEV_CONTROLLER

}DEV_TYPE_ENUM;

#define USARTx_RxTimeout              8
#define USARTx_RxBufferSize           512

/* 函数声明 */
void bsp_InitUart(void);


void comSendChar(COM_PORT_E _ucPort, uint8_t _ucByte);
void comSendBuf(COM_PORT_E _ucPort, uint8_t *_ucaBuf, uint16_t _usLen);
uint8_t comGetChar(COM_PORT_E _ucPort, uint8_t *_pByte);

bool USART_Start (DEV_TYPE_ENUM dev, usart_procDataHdlr_f DataHandler );

#endif


